package com.liugh.util;

import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpRequest;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.liugh.base.Constant;
import org.apache.commons.lang3.StringEscapeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public final class CommonUtil {
    private static final Logger LOGGER =LoggerFactory.getLogger(CommonUtil.class);

    public static final ObjectMapper JACKSON_OBJ_MAPPER = new ObjectMapper()
            .registerModule(new JavaTimeModule())
            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
            .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)                   // 下划线转驼峰
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)       // 忽略不在类中的Json属性
            .setSerializationInclusion(JsonInclude.Include.ALWAYS);

    /**
     * 从json字符串中解析得到指定的类.
     * @param json json字符串
     * @param cls 需要解析成的对象
     * @param <T> 对象类型
     * @return 解析成的对象
     */
    public static <T> T fromJson(String json, Class<T> cls) {
        try {
            return JACKSON_OBJ_MAPPER.readValue(json, cls);
        } catch (IOException e) {
            LOGGER.error("从json解析失败！", e);
        }
        return null;
    }


    /**
     * 将对象转换成字符串.
     * @param object 需要转换成json的对象
     * @return json字符串
     */
    public static String toJson(Object object) {
        String result = null;
        try {
            result = JACKSON_OBJ_MAPPER.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            LOGGER.error("转换成json字符串失败！", e);
        }
        return result;
    }


    /**
     * 根据db返回的id判断相关的操作是否成功.
     * @param effectNum 数据库操作影响的行数
     * @return 是否成功
     */
    public static boolean isDBOpSuccess(int effectNum) {
        return effectNum > 0;
    }


  /**
     * json字符串去除 / 转义
     * @param jsonStr
     * @return
     */
    public static String jsonRidTrans(String jsonStr) {
        return StringEscapeUtils.unescapeJson(jsonStr);
    }


    /**
     * 中车公司从URL中获取group 和 name
     * @param url
     * @return
     */
    public static Map<String,String> getGroupAndName(String url) {
        String tem =url.split("8888/")[1];
        String group = tem.substring(0,tem.indexOf("/"));
        String name = tem.split(group)[1].substring(1);
        Map<String,String> map = new HashMap<>();
        map.put("group",group);
        map.put("name",name);
        return map;
    }

    /**
     * 中车公司中通过文件url得到远程文件名
     * @param url
     * @return
     */
    public static String getFileNameByUrl(String url) {
        String[] strings = url.split("8888");
        return strings[1];
    }

    /**
     * 返回结果：检查具体日期是否为节假日，工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2；
     */
    private static String getDayStatus(Date date) {
        return HttpRequest.get(Constant.dc + DateUtil.format(date,"yyyyMMdd")).execute().body();
    }

}
